﻿using DevExpress.XtraEditors;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MesProjectWinform.Public.Common;
using MesProjectWinform.BasicData.Entity;
using Newtonsoft.Json;
using System.IO;

namespace MesProjectWinform.BasicData.基础实现.kehu
{
    public partial class keup : DevExpress.XtraEditors.XtraForm
    {
        private long _consumerId = 0;
        private Consumermodel _consumerData;
        private bool isEdit = false; // 标记当前是编辑还是新增操作
        // 序号存储文件路径
        private readonly string sequenceFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CustomerSequence.txt");
        // 日期格式化字符串
        private readonly string dateFormat = "yyMMdd";

        public keup()
        {
            InitializeComponent();
            
            // 设置编码文本框为只读
            if (textEdit1 != null)
                textEdit1.Properties.ReadOnly = true;
            
            // 添加窗体加载事件
            this.Load += Keup_New_Load;
        }

        public keup(long id)
        {
            InitializeComponent();
            _consumerId = id;
            isEdit = true;
            
            // 设置编码文本框为只读
            if (textEdit1 != null)
                textEdit1.Properties.ReadOnly = true;
                
            this.Load += Keup_Load;
        }
        
        /// <summary>
        /// 新增模式下的窗体加载事件
        /// </summary>
        private void Keup_New_Load(object sender, EventArgs e)
        {
            // 生成自动递增编码（仅在新增模式下）
            GenerateAutoIncrementCode();
        }

        /// <summary>
        /// 生成自动递增的客户编码
        /// </summary>
        private void GenerateAutoIncrementCode()
        {
            // 只有在新增模式下才生成自动编码
            if (isEdit)
                return;
                
            try
            {
                // 生成当前日期部分 格式：yyMMdd
                string today = DateTime.Now.ToString(dateFormat);
                
                // 读取序号文件，获取当前最大序号
                int currentSequence = 1; // 默认从1开始
                string lastDate = string.Empty;
                
                if (File.Exists(sequenceFilePath))
                {
                    string[] fileContent = File.ReadAllLines(sequenceFilePath);
                    if (fileContent.Length >= 2)
                    {
                        lastDate = fileContent[0]; // 第一行存储日期
                        int.TryParse(fileContent[1], out currentSequence); // 第二行存储序号
                        
                        // 如果是新的一天，重置序号为1
                        if (lastDate != today)
                        {
                            currentSequence = 1;
                        }
                        // 注意：此处不自增序号，只显示当前序号
                    }
                }
                
                // 格式化为4位数字，前面补0
                string serialPart = currentSequence.ToString().PadLeft(4, '0');
                
                // 组合最终的编码：KH + 日期 + 4位序号
                string finalCode = "KH" + today + serialPart;
                
                // 设置到文本框
                textEdit1.Text = finalCode;
                
                Console.WriteLine($"生成客户编码: {finalCode}, 序号: {currentSequence}");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"生成客户编码时发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                // 生成失败时使用默认编码
                textEdit1.Text = "KH" + DateTime.Now.ToString(dateFormat) + "0001";
            }
        }
        
        /// <summary>
        /// 保存成功后更新序号
        /// </summary>
        private void UpdateSequenceAfterSuccess()
        {
            // 只有在新增模式下成功保存后才更新序号
            if (isEdit)
                return;
                
            try
            {
                // 获取当前日期
                string today = DateTime.Now.ToString(dateFormat);
                int currentSequence = 1;
                
                // 读取当前序号
                if (File.Exists(sequenceFilePath))
                {
                    string[] fileContent = File.ReadAllLines(sequenceFilePath);
                    if (fileContent.Length >= 2)
                    {
                        string lastDate = fileContent[0];
                        int.TryParse(fileContent[1], out currentSequence);
                        
                        // 如果是新的一天，重置序号为1
                        if (lastDate != today)
                        {
                            currentSequence = 1;
                        }
                        else
                        {
                            // 否则序号加1
                            currentSequence++;
                        }
                    }
                }
                
                // 保存更新后的序号到文件
                using (StreamWriter writer = new StreamWriter(sequenceFilePath, false))
                {
                    writer.WriteLine(today);
                    writer.WriteLine(currentSequence.ToString());
                }
                
                Console.WriteLine($"更新序号成功: 日期={today}, 新序号={currentSequence}");
            }
            catch (Exception ex)
            {
                // 更新序号失败不影响主流程，可以静默处理
                Console.WriteLine($"更新序号失败：{ex.Message}");
            }
        }

        private async void Keup_Load(object sender, EventArgs e)
        {
            if (_consumerId > 0)
            {
                await LoadConsumerData();
            }
        }

        /// <summary>
        /// 加载客户数据
        /// </summary>
        private async Task LoadConsumerData()
        {
            try
            {
                string url = $"api/Consumer/GetConsumerById?id={_consumerId}";
                string result = await HttpClientHelper.RequestUrl(RequestType.Get, url, "");

                if (!string.IsNullOrEmpty(result))
                {
                    dynamic response = JsonConvert.DeserializeObject(result);
                    
                    if (response != null && response.Code.ToString() == "200" && response.Data != null)
                    {
                        _consumerData = JsonConvert.DeserializeObject<Consumermodel>(response.Data.ToString());
                        
                        if (_consumerData != null)
                        {
                            // 反填数据到表单
                            FillFormData();
                        }
                    }
                    else
                    {
                        string errorMsg = response != null && response.Message != null 
                            ? response.Message.ToString() 
                            : "未知错误";
                        MessageBox.Show($"获取客户数据失败：{errorMsg}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show("获取客户数据失败：未收到服务器响应", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"获取客户数据出错：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 填充表单数据
        /// </summary>
        private void FillFormData()
        {
            // 假设表单中有以下控件，根据实际情况调整控件名称
            if (textEdit1 != null) textEdit1.Text = _consumerData.Consumercode;
            if (textEdit2 != null) textEdit2.Text = _consumerData.Consumername;
            if (textEdit3 != null) textEdit3.Text = _consumerData.Consumerabbreviation;
            if (textEdit4 != null) textEdit4.Text = _consumerData.Consumerphone;
            if (textEdit5 != null) textEdit5.Text = _consumerData.Consumeradress;
            if (textEdit6 != null) textEdit6.Text = _consumerData.Consumerremarks;
            if (memoEdit1 != null) memoEdit1.Text = _consumerData.Socialcredit;
        }

        /// <summary>
        /// 重置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (isEdit && _consumerData != null)
            {
                // 重新填充原始数据
                FillFormData();
            }
            else
            {
                // 只有在新增模式下才需要重新生成编码
                if (!isEdit)
                {
                    // 重新生成自动递增编码
                    GenerateAutoIncrementCode();
                }
                
                // 清空其他输入框
                textEdit2.Text = string.Empty; // 客户名称
                textEdit3.Text = string.Empty; // 客户简称
                textEdit4.Text = string.Empty; // 客户电话
                textEdit5.Text = string.Empty; // 客户地址
                textEdit6.Text = string.Empty; // 客户备注
                memoEdit1.Text = string.Empty; // 社会信用代码
            }
        }
        
        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void button2_Click(object sender, EventArgs e)
        {
            // 验证输入
            if (string.IsNullOrWhiteSpace(textEdit1.Text))
            {
                MessageBox.Show("客户编码不能为空！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (string.IsNullOrWhiteSpace(textEdit2.Text))
            {
                MessageBox.Show("客户名称不能为空！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            // 禁用保存按钮，防止重复提交
            button2.Enabled = false;
            
            // 显示等待提示
            Cursor = Cursors.WaitCursor;
            
            try
            {
                // 准备数据
                Consumermodel model = new Consumermodel
                {
                    Consumercode = textEdit1.Text.Trim(),
                    Consumername = textEdit2.Text.Trim(),
                    Consumerabbreviation = textEdit3.Text?.Trim() ?? string.Empty,
                    Consumerphone = textEdit4.Text?.Trim() ?? string.Empty,
                    Consumeradress = textEdit5.Text?.Trim() ?? string.Empty,
                    Consumerremarks = textEdit6.Text?.Trim() ?? string.Empty,
                    Socialcredit = memoEdit1.Text?.Trim() ?? string.Empty,
                    IsDeleted = false
                };

                string result;
                
                // 如果是编辑模式
                if (isEdit && _consumerId > 0)
                {
                    model.Id = _consumerId;
                    Console.WriteLine($"修改模式: ID={model.Id}");
                    
                    // 如果有原始客户数据，保留原有的创建人和创建时间
                    if (_consumerData != null)
                    {
                        model.CreatedBy = _consumerData.CreatedBy;
                        model.CreatedTime = _consumerData.CreatedTime;
                        
                        // 记录原始数据信息用于调试
                        Console.WriteLine($"原始客户信息: 创建人={_consumerData.CreatedBy}, 创建时间={_consumerData.CreatedTime}");
                    }
                    else
                    {
                        // 如果没有原始数据，设置默认创建信息
                        model.CreatedBy = "admin";
                        model.CreatedTime = DateTime.Now;
                        Console.WriteLine("警告：原始客户信息为空，使用默认创建信息");
                    }
                    
                    // 设置修改人为"admin"，修改时间为当前时间
                    model.UpdatedBy = "admin";
                    model.UpdatedTime = DateTime.Now;
                    
                    // 确保ID字段正确设置
                    Console.WriteLine($"准备修改客户，ID={model.Id}, 编码={model.Consumercode}, 名称={model.Consumername}");
                    
                    // 转换为JSON
                    string jsonData = JsonConvert.SerializeObject(model);
                    Console.WriteLine($"修改请求数据: {jsonData}");
                    
                    // 使用修改接口
                    string url = "api/Consumer/UpdateConsumer";
                    Console.WriteLine($"请求修改API: {url}");
                    
                    // 使用 HttpClientHelper 发送请求 (POST方法)
                    result = await HttpClientHelper.RequestUrl(RequestType.Post, url, jsonData);
                    Console.WriteLine($"修改API返回结果: {result}");
                }
                // 如果是新增模式
                else
                {
                    Console.WriteLine("新增模式");
                    // 设置创建信息
                    model.CreatedBy = "admin";
                    model.CreatedTime = DateTime.Now;
                    model.UpdatedBy = "admin"; // 新增时，修改人也是创建人
                    model.UpdatedTime = DateTime.Now;
                    
                    // 确保ID为0（新增时不需要ID）
                    model.Id = 0;
                    
                    // 转换为JSON
                    string jsonData = JsonConvert.SerializeObject(model);
                    Console.WriteLine($"新增请求数据: {jsonData}");
                    
                    // 使用新增接口
                    string url = "api/Consumer/AddConsumer";
                    Console.WriteLine($"请求新增API: {url}");
                    
                    // 使用 HttpClientHelper 发送请求 (POST方法)
                    result = await HttpClientHelper.RequestUrl(RequestType.Post, url, jsonData);
                    Console.WriteLine($"新增API返回结果: {result}");
                }
                
                // 处理API返回结果
                if (!string.IsNullOrEmpty(result))
                {
                    // 检查返回结果是否包含成功信息
                    bool isSuccess = true;
                    
                    try
                    {
                        // 尝试解析API返回结果
                        dynamic response = JsonConvert.DeserializeObject<dynamic>(result);
                        if (response != null && 
                            ((response.code != null && response.code.ToString() != "200") || 
                             (response.Code != null && response.Code.ToString() != "200")))
                        {
                            isSuccess = false;
                            string message = response.message ?? response.Message ?? "未知错误";
                            MessageBox.Show($"操作失败：{message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    catch (Exception ex)
                    {
                        // 解析失败，记录异常但仍然继续（可能API返回非标准格式）
                        Console.WriteLine($"解析API返回结果异常: {ex.Message}");
                    }
                    
                    if (isSuccess)
                    {
                        // 保存成功后更新序号（仅在新增模式下）
                        if (!isEdit)
                        {
                            Console.WriteLine("保存成功，开始更新序号");
                            UpdateSequenceAfterSuccess();
                        }
                        
                        MessageBox.Show(isEdit ? "修改成功！" : "添加成功！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        
                        // 关闭窗体并返回
                        DialogResult = DialogResult.OK;
                        this.Close();
                    }
                }
                else
                {
                    MessageBox.Show(isEdit ? "修改失败！" : "添加失败！", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"保存操作发生异常: {ex.Message}\n{ex.StackTrace}");
                MessageBox.Show($"操作失败：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                // 恢复保存按钮
                button2.Enabled = true;
                
                // 恢复鼠标指针
                Cursor = Cursors.Default;
            }
        }
    }
}